package com.c2b.algorithm.leetcode.base;

import java.util.Arrays;

/**
 * <a href="https://leetcode.cn/problems/special-array-with-x-elements-greater-than-or-equal-x/">特殊数组的特征值</a>
 * <p>
 * 给你一个非负整数数组 nums 。如果存在一个数 x ，使得 nums 中恰好有 x 个元素 大于或者等于 x ，那么就称 nums 是一个 特殊数组 ，而 x 是该数组的 特征值 。<br>
 * 注意： x 不必 是 nums 的中的元素。<br>
 * 如果数组 nums 是一个 特殊数组 ，请返回它的特征值 x 。否则，返回 -1 。可以证明的是，如果 nums 是特殊数组，那么其特征值 x 是 唯一的 。
 * </p>
 * <pre>
 * 示例 1：
 *      输入：nums = [3,5]
 *      输出：2
 *      解释：有 2 个元素（3 和 5）大于或等于 2 。
 *
 * 示例 2：
 *      输入：nums = [0,0]
 *      输出：-1
 *      解释：没有满足题目要求的特殊数组，故而也不存在特征值 x 。
 *          如果 x = 0，应该有 0 个元素 >= x，但实际有 2 个。
 *          如果 x = 1，应该有 1 个元素 >= x，但实际有 0 个。
 *          如果 x = 2，应该有 2 个元素 >= x，但实际有 0 个。
 *          x 不能取更大的值，因为 nums 中只有两个元素。
 *
 * 示例 3：
 *      输入：nums = [0,4,3,0,4]
 *      输出：3
 *      解释：有 3 个元素大于或等于 3 。
 *
 * 示例 4：
 *      输入：nums = [3,6,7,7,0]
 *      输出：-1
 * </pre>
 * <b>提示：</b>
 * <ui>
 * <li>1 <= nums.length <= 100</li>
 * <li>0 <= nums[i] <= 1000</li>
 * </ui>
 *
 * @author c2b
 * @since 2023/4/13 16:28
 */
public class LC1608SpecialArray_S {

    public int specialArray(int[] nums) {
        // 对数组进行排序
        Arrays.sort(nums);
        // 特殊值最大为数值中元素的个数
        int specialVal = nums.length;
        for (int i = 0; i < nums.length; ++i) {
            // currIndex 从0开始逐渐向右
            int currIndex = nums.length - specialVal;
            // 如果当前位置的数值大于等于 specialVal
            if (nums[currIndex] >= specialVal) {
                // 需要判断当前位置的数值是否大于前一个位置的数值
                return i == 0 || nums[currIndex - 1] < specialVal ? specialVal : -1;
            }
            // 缩小特殊值
            --specialVal;
        }
        return -1;
    }

    public static void main(String[] args) {
        System.out.println(new LC1608SpecialArray_S().specialArray(new int[]{1, 0, 0, 6, 4, 9}));
    }
}
